#include "demuxer.h"
#include <iostream>
#include <thread>
#include "tools.h"
using namespace std;
extern "C"
{
#include <libavformat/avformat.h>
}

namespace lcf
{

    AVFormatContext *Demuxer::Open(const char *url)
    {
        AVFormatContext *context = nullptr;

        AVDictionary *opts = nullptr;
        // av_dict_set(&opts, "rtsp_transport", "tcp", 0);//传输媒体流为tcp协议，默认udp
        av_dict_set(&opts, "stimeout", "1000000", 0); // 连接超时1秒

        // 打开封装上下文
        auto re = avformat_open_input(&context, url, nullptr, &opts);
        if (opts)
            av_dict_free(&opts);
        PrintErr(re);
        // 获取媒体信息
        re = avformat_find_stream_info(context, nullptr);
        PrintErr(re);
        //  打印输入封装信息
        // av_dump_format(c, 0, url, 0);
        return context;
    }

    bool Demuxer::Read(AVPacket *pkt)
    {
        unique_lock<mutex> lock(mtx_);
        if (!context_)
        {
            return false;
        }
        auto re = av_read_frame(context_, pkt);
        PrintErr(re);

        // 计时 用于超时判断
        lastTime_ = NowMs();
        return true;
    }

    bool Demuxer::Seek(long long pts, int streamIndex)
    {
        unique_lock<mutex> lock(mtx_);
        if (!context_)
            return false;
        auto re = av_seek_frame(context_, streamIndex, pts,
                                AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD);
        PrintErr(re);
        return true;
    }
}
